package com.engc.common.service;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import com.engc.common.dao.DBExecuteException;


public interface BaseService {
	/**
	 * 保存一条记录
	 * 
	 * @param tableName
	 *            表名
	 * @param pojo
	 *            实体类
	 * @return
	 */
	public int Insert(String tableName, Object pojo) throws Exception;

	/**
	 * 保存一条记录
	 * 
	 * @param tableName
	 *            表名
	 * @param pojo
	 *            实体类
	 * @param column
	 *            需要保存的列
	 * @return
	 */
	public int Insert(String tableName, Object pojo, String... column)
			throws Exception;

	/**
	 * 保存一条Record 记录
	 * 
	 * @param tableName
	 *            表名
	 * @param record
	 *            一条Record 记录
	 * @return
	 */
	public int Insert(String tableName, Map<String,Object> record) throws Exception;

	/**
	 * 保存数据
	 * 
	 * @param sql
	 *            SQL语句
	 * @param parameter
	 *            参数
	 * @return
	 */
	public int InsertBySql(String sql, Object... parameter) throws Exception;

	/**
	 * 修改一条记录
	 * 
	 * @param tableName
	 *            表名
	 * @param pojo
	 * @return
	 */
	public int Update(String tableName, Object pojo, String where,
			Object... parameter) throws Exception;

	/**
	 * 修改一条记录
	 * 
	 * @param tableName
	 * @param pojo
	 * @param column
	 * @return
	 */
	public int Update(String tableName, Object pojo, String where,
			String[] column, Object... parameter) throws Exception;

	/**
	 * 修改一条记录
	 * 
	 * @param tableName
	 *            表名
	 * @param record
	 *            Record
	 * @return
	 */
	public int Update(String tableName, Map<String,Object> record, String where,
			Object... parameter) throws Exception;

	/**
	 * 更新记录
	 * 
	 * @param sql
	 *            SQL语句
	 * @param parameter
	 *            参数
	 * @return
	 */
	public int Update(String sql, Object... parameter) throws Exception;
	
	/**
	 * 新增或者插入一条记录
	 * 
	 * @param tableName
	 *            表名
	 * @param record
	 *            Record
	 * @return
	 */
	public void saveOrUpdate(String tableName, Map<String,Object> record, String where,
			Object... parameter) throws Exception;

	/**
	 * 删除记录
	 * 
	 * @param table
	 *            表名
	 * @param where
	 *            where 条件
	 * @param parameter
	 *            参数
	 * @return
	 */
	public int Delete(String table, String where, Object... parameter)
			throws Exception;

	/**
	 * 删除记录
	 * 
	 * @param sql
	 *            SQL语句
	 * @param parameter
	 *            参数
	 * @return
	 */
	public int Delete(String sql, Object... parameter) throws Exception;

	/**
	 * 查询一个Record
	 * 
	 * @param sql
	 *            SQL语句
	 * @param parameter
	 *            参数
	 * @return
	 */
	public Map<String,Object> Read(String sql, Object... parameter);

	/**
	 * 查询一个Bean
	 * 
	 * @param clazz
	 *            Bean 类型
	 * @param sql
	 *            SQL语句
	 * @param parameter
	 *            参数
	 * @return
	 */
	public <T> T Read(Class<T> clazz, String sql, Object... parameter);

	/**
	 * 查询多条记录
	 * 
	 * @param sql
	 * @param parameter
	 * @return
	 */
	public List<Map<String,Object>> Query(String sql, Object... parameter);

	/**
	 * 查询
	 * 
	 * @param clazz
	 * @param sql
	 * @param parameter
	 * @return
	 */
	public <T> List<T> Query(Class<T> clazz, String sql, Object... parameter);

	/**
	 * Oracle 分页查询
	 * 
	 * @param beanClass
	 * @param sql
	 * @param page
	 * @param pagesize
	 * @param params
	 * @return
	 */
	public <T> List<T> Query_SliceOracle(Class<T> beanClass, String sql,
			int page, int pagesize, Object... params);

	/**
	 * MySQL 分页查询
	 * 
	 * @param beanClass
	 * @param sql
	 * @param page
	 * @param pagesize
	 * @param pars
	 * @return
	 */
	public <T> List<T> Query_SliceMySql(Class<T> beanClass, String sql,
			int page, int pagesize, Object... pars);

	/**
	 * Oracle 分页查询
	 * 
	 * @param sql
	 *            SQL语句
	 * @param page
	 *            第多少页
	 * @param pagesize
	 *            每页大小
	 * @param parameter
	 *            参数
	 * @return
	 */
	public List<Map<String,Object>> Query_SliceOracle(String sql, int page, int pagesize,
			Object... parameter);

	/**
	 * MySQL 分页查询
	 * 
	 * @param sql
	 *            SQL语句
	 * @param page
	 *            第多少页
	 * @param pagesize
	 *            每页大小
	 * @param parameter
	 *            参数
	 * @return
	 */
	public List<Map<String,Object>> Query_SliceMySql(String sql, int page, int pagesize,
			Object... parameter);

	/**
	 * 从缓存中读取
	 * 
	 * @param cacheName
	 *            Cache名称
	 * @param key
	 *            缓存Key
	 * @param sql
	 *            SQL语句
	 * @param params
	 *            参数
	 * @return
	 */
	public Map<String,Object> Read_Cache(String cacheName, Serializable key, String sql,
			Object... params);

	/**
	 * 从缓存中读取Bean
	 * 
	 * @param beanClass
	 *            Bean类
	 * @param cacheName
	 *            Cache名称
	 * @param key
	 *            缓存Key
	 * @param sql
	 *            SQL语句
	 * @param params
	 *            参数
	 * @return
	 */
	public <T> T Read_Cache(Class<T> beanClass, String cacheName,
			Serializable key, String sql, Object... params);

	/**
	 * 从缓存中读取List
	 * 
	 * @param cacheName
	 *            Cache名称
	 * @param key
	 *            缓存Key
	 * @param sql
	 *            SQL语句
	 * @param params
	 *            参数
	 * @return
	 */
	public List<Map<String,Object>> Query_Cache(String cacheName, Serializable key,
			String sql, Object... params);

	/**
	 * 从缓存中查询
	 * 
	 * @param beanClass
	 *            Bean 类
	 * @param cacheName
	 *            Cache名称
	 * @param key
	 *            缓存Key
	 * @param sql
	 *            Sql语句
	 * @param params
	 *            参数
	 * @return
	 */
	public <T> List<T> Query_Cache(Class<T> beanClass, String cacheName,
			Serializable key, String sql, Object... params);

	
	
	/**
	 * 执行DML语句
	 * 
	 * @param sql
	 * @param pars
	 * @return
	 * @throws Exception
	 */
	public int execute(String sql, Object... pars) throws Exception;

	
	/**
	 * 获取总记录数 
	 * @param tableName 表名
	 * @param sWhere   Where 条件
	 * @param params   参数
	 * @return
	 */
	public  int getTotal(String tableName,String sWhere , Object... params);
	
	/**
	 * 获取总记录数
	 * @param sql   SQL语句
	 * @param parameter  参数
	 * @return
	 */
	public int getTotal(String sql,Object...parameter);
	
	
	/**
	 * 执行select count(1) from table  语句
	 * @param sql
	 * @param parameter
	 * @return
	 */
	public  int executeCountSql(String sql , Object... parameter);
	
	
	/**
	 * 查询Sequence 最大值
	 * @param seqName
	 * @return
	 */
	public String getSeqValue(String seqName);
	
	/**
	 * 逻辑删除
	 * @param tableName 表名	
	 * @param where   Where 条件
	 * @param params  参数
	 * @return
	 */
	public int logicDelete(String tableName,String where,Object... params) throws Exception;
	
	
	
	/**
	 * 添加操作日志至数据库中
	 * @param tableName  表名
	 * @param id                 ID
	 * @param operuser     操作人
	 * @param action         操作类型
	 * @param remark    操作说明
	 * @throws Exception
	 */
	public void addOperationLog(String tableName,String id,String operuser,int action,String remark) throws Exception;
	
	/**
	 * 获取新增日志信息
	 * @param tableName 表名
	 * @param id   ID
	 * @return
	 */
	public Map<String,Object> getOperationLogInfoByAdd(String tableName,String id);
	
	/**
	 * 获取表最后修改日志信息
	 * @param tableName   表名
	 * @param id                  ID
	 * @return
	 */
	public Map<String,Object> getOperationLogInfoByLastModify(String tableName,String id);
	
	/**
	 * 获取表审批日志信息
	 * @param tableName
	 * @param id
	 * @return
	 */
	public Map<String,Object> getOperationLogInfoByApply(String tableName,String id);
	/**
	 * <h1>使用方法</h1>
	 * <pre>
	 *  查询语句为复杂SQL语句时
	 *  例如 select * from table1 a,table2 b,table3 c where a.xxx=b.xxx and b.xxx=c.xxx and a.xxx=? b.xxx=?
	 *  可在前端将Sql写成
	 *     select * from (select * from table1 a,table2 b,table3 c where a.xxx=b.xxx and b.xxx=c.xxx) k
	 *  调用本方法格式为
	 *  getGridData(sql,"k",request);
	 *  方法将自动组装相应的sql语句：组成胡格式为
	 *   select * from (select * from table1 a,table2 b,table3 c where a.xxx=b.xxx and b.xxx=c.xxx) k where k.xxx=? and k.x1=?
	 *  方法将自动组装相应的where 语句，将查询结果以grid 需要的格式返回
	 * </pre>
	 * @param Sql sql语句
	 * @param alien 别名
	 * @param req request 请求
	 * @return 分页Grid数据
	 */
	
	public Map<String,Object> getGridData(String Sql, String alien,
			HttpServletRequest req);
	
	public static final int actionAdd = 1;
	public static final int actionModify = 2;
	public static final int actionDelete = 3;
	public static final int actionApply = 4;
	
}
